package frpc.manager.list;

import frpc.manager.basics.IRedisBusinessManager;
import frpc.manager.operation.GiveCacheData;
import org.springframework.data.redis.core.ListOperations;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 类描述:  Redis——List处理接口
 *
 * @author 王雷
 * @version 1.0.0
 * @date 2022/6/2 0002 下午 3:12
 */
public interface IRedisListManager extends IRedisBusinessManager {

    /**
     * 类描述: 插入类型
     *
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    enum ListPutType {
        /**
         * 属性描述：左边
         *
         * @date : 2019/10/16 0016 下午 3:37
         */
        Left,
        /**
         * 属性描述：右边
         *
         * @date : 2022/6/2 0002 下午 3:12
         */
        Right
    }

    /**
     * 功能描述：获取Hash处理对象完成自定义处理
     *
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> ListOperations<String, T> giveListOperations();

    /**
     * 功能描述：添加数据到指定的Key中
     *
     * @param key         需要插入的Key
     * @param value       需要插入的内容
     * @param listPutType 插入类型
     * @param time        失效时间，单位：秒
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> void addValueByKey(String key, List<T> value, ListPutType listPutType, long time);

    /**
     * 功能描述：添加数据到指定的Key中，不限制时间
     *
     * @param key         需要插入的Key
     * @param value       需要插入的内容
     * @param listPutType 插入类型
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> void addValueByKey(String key, List<T> value, ListPutType listPutType);

    /**
     * 功能描述：添加数据到指定的Key中
     *
     * @param key         需要插入的Key
     * @param value       需要插入的内容
     * @param listPutType 插入类型
     * @param time        失效时间，单位：秒
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> void addValueByKey(String key, T value, ListPutType listPutType, long time);

    /**
     * 功能描述：添加数据到指定的Key中，不限制时间
     *
     * @param key         需要插入的Key
     * @param value       需要插入的内容
     * @param listPutType 插入类型
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> void addValueByKey(String key, T value, ListPutType listPutType);

    /**
     * 功能描述：删除数据
     *
     * @param key   需要处理的Key
     * @param count 删除的数量，在Redis中会存在多个数据一样的情况
     * @param value 需要删除的对象
     * @author : 王雷
     * @date : 2020/11/28 0028 下午 5:13
     */
    <T> long removeValueByKey(String key, long count, T value);

    /**
     * 获取数据
     *
     * @param key 键
     * @return 值
     */
    <T> List<T> giveValueByKey(String key);

    /**
     * 获取数据
     *
     * @param key   键
     * @param start 开始下标
     * @param end   结束下标
     * @return 值
     */
    <T> List<T> giveValueByKey(String key, long start, long end);

    /**
     * 获取数据长度
     *
     * @param key 键
     * @return 长度
     */
    Long giveSizeByKey(String key);

    /**
     * 功能描述：取值类型
     * <br />
     * 获取值时会直接将数据删除
     *
     * @param key         需要提取的数据Key
     * @param listPutType 取值类型
     * @return : 查询结果
     * @author : 王雷
     * @date : 2020/11/28 0028 下午 3:28
     */
    <T> T giveDataByKey(String key, ListPutType listPutType);

    /**
     * 功能描述：通过阻塞的方式获取数据
     * <br />
     * 获取值时会直接将数据删除
     *
     * @param key         需要提取数据的Key
     * @param blockTime   等待的时间
     * @param listPutType 提取类型
     * @return : 结果
     * @author : 王雷
     * @date : 2020/11/28 0028 下午 3:42
     */
    <T> T blockDataByKey(String key, long blockTime, ListPutType listPutType);

    /**
     * 功能描述：获取数据，带锁处理
     *
     * @param key           需要查询的Key
     * @param giveCacheData 需要执行的回调函数
     * @return : 结果
     * @throws Exception 执行异常
     * @author : 王雷
     * @date : 2020/11/30 0030 下午 7:51
     */
    <T> List<T> giveValueByKeyToLock(String key, GiveCacheData<List<T>> giveCacheData, ListPutType listPutType) throws Exception;

    /**
     * 功能描述：获取数据，带锁处理
     *
     * @param key           需要查询的Key
     * @param giveCacheData 需要执行的回调函数
     * @param start         开始下标
     * @param end           结束下标
     * @param giveCacheData 需要执行的回调函数
     * @return : 结果
     * @throws Exception 执行异常
     * @author : 王雷
     * @date : 2020/11/30 0030 下午 7:51
     */
    <T> List<T> giveValueByKeyToLock(String key, long start, long end, GiveCacheData<List<T>> giveCacheData
            , ListPutType listPutType) throws Exception;

    /**
     * 功能描述：获取数据，带锁处理
     *
     * @param key           需要查询的Key
     * @param giveCacheData 需要执行的回调函数
     * @param putMaxTime    存储的时间
     * @return : 结果
     * @throws Exception 执行异常
     * @author : 王雷
     * @date : 2020/11/30 0030 下午 7:51
     */
    <T> List<T> giveValueByKeyToLock(String key, long start, long end, GiveCacheData<List<T>> giveCacheData, ListPutType listPutType
            , Long putMaxTime, TimeUnit timeUnit) throws Exception;
}
